{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "<center>\n",
    "<img src=\"https://habrastorage.org/files/fd4/502/43d/fd450243dd604b81b9713213a247aa20.jpg\">\n",
    "## Open Machine Learning Course\n",
    "<center>Author: [Yury Kashnitsky](https://www.linkedin.com/in/festline/), Data Scientist chez Mail.ru Group <br>\n",
    "    <center> Edité et traduit par [Cissé Ousmane](https://github.com/oussou-dev) <br>\n",
    "    Tout le contenu est distribué sous la licence [Creative Commons CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/).\n",
    "Vous pouvez utiliser ce matériel à n'importe quelle fin (vous pouvez éditer, corriger et utiliser comme exemple) sauf un usage commercial avec mention obligatoire de l'auteur.</center></center></center>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "# <center> Misson n ° 6 (démo).\n",
    "## <center> Exploration de OLS (Moindres carrés ordinaires), Lasso et forêt aléatoire <br> dans une problème de régression\n",
    "    \n",
    "<img src=\"https://habrastorage.org/webt/-h/ns/aa/-hnsaaifymavmmudwip9imcmk58.jpeg\" width=\"30%\">\n",
    "\n",
    "**Remplissez le code manquant et choisissez les réponses dans ce [formulaire](https://docs.google.com/forms/d/1aHyK58W6oQmNaqEfvpLTpo6Cb0-ntnvJ18rZcvclkvw/edit).**</center></center>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "5a5dbe8ccaac5938472fffabd662570bbee580a5"
   },
   "outputs": [],
   "source": [
    "import warnings\n",
    "\n",
    "warnings.filterwarnings(\"ignore\")\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn.ensemble import RandomForestRegressor\n",
    "from sklearn.linear_model import Lasso, LassoCV, LinearRegression\n",
    "from sklearn.metrics.regression import mean_squared_error\n",
    "from sklearn.model_selection import (GridSearchCV, cross_val_score,\n",
    "                                     train_test_split)\n",
    "from sklearn.preprocessing import StandardScaler"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "**Nous travaillons avec le jeu de données de qualité UCI Wine (inutile de le télécharger: il est déjà disponible, dans le référentiel de cours et dans le jeu de données Kaggle).**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "6fbd38aed5fa42e075b5d5a33e8e2da21807ad75"
   },
   "outputs": [],
   "source": [
    "data = pd.read_csv(\"../input/winequality-white.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "0ca6a09adeecd4dc07b33e765baa4ea82820fe37"
   },
   "outputs": [],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "8567888d41488b52f8b2d3dff80bd2d16c3df07d"
   },
   "outputs": [],
   "source": [
    "data.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "**Séparez la caractéristique cible, divisez les données en proportion de 7:3 (30% forment le holdout set (jeu de données de validation), utilisez random_state = 17), et prétraitez les données avec `StandardScaler`.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "22991d1fcd912df4535ec8e0dd804d9d66b336f6"
   },
   "outputs": [],
   "source": [
    "# y = None # you code here\n",
    "\n",
    "# X_train, X_holdout, y_train, y_holdout = train_test_split # you code here\n",
    "# scaler = StandardScaler()\n",
    "# X_train_scaled = scaler.fit_transform # you code here\n",
    "# X_holdout_scaled = scaler.transform # you code here"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "## Régression linéaire"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "**Entraîner un modèle de régression linéaire simple (Moindres carrés ordinaires).**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "d228bb880c81ea10ad104e1f9685c8a2ee95ae97"
   },
   "outputs": [],
   "source": [
    "# linreg = # you code here\n",
    "# linreg.fit # you code here"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "**<font>Question 1: </font> Quelles sont les prédictions des erreurs quadratiques moyennes sur les données d'entraînement et les données de validation?**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "546f6310409fd0cced8e9cf9b5b9b647bc519b4a"
   },
   "outputs": [],
   "source": [
    "# print(\"Mean squared error (train): %.3f\" % # you code here\n",
    "# print(\"Mean squared error (test): %.3f\" % # you code here"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "**Triez les caractéristiques en fonction de leur influence sur la caractéristique cible : qualité du vin (wine quality). Attention, les grands coefficients positifs et les grands coefficients négatifs signifient une influence importante sur la cible. C'est pratique d'utiliser `pandas.DataFrame` ici.**\n",
    "\n",
    "**<font>Question 2: </font> Quelle caractéristique ce modèle de régression linéaire considère-t-il comme la plus influente sur la qualité du vin (wine quality)?**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "00f2cd04fdee695e60a0019a095999c1b9d98ff7"
   },
   "outputs": [],
   "source": [
    "# linreg_coef = pd.DataFrame # you code here\n",
    "# linreg_coef.sort_values # you code here"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "## Régression Lasso"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "**Entraîner un modèle LASSO avec $\\alpha = 0.01$ (régularisation faible) et des données mises à l’échelle. De nouveau, définissez random_state = 17.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "c93c9f0aef5c045104cd170a415f0138ecfde280"
   },
   "outputs": [],
   "source": [
    "# lasso1 = Lasso # you code here\n",
    "# lasso1.fit # you code here"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "**Quelle caractéristique est la moins informative pour prédire la qualité du vin, selon ce modèle LASSO?**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "a3e0123570f2bfc183e9af04fc09de4aa00a3e33"
   },
   "outputs": [],
   "source": [
    "# lasso1_coef = pd.DataFrame # you code here\n",
    "# lasso1_coef.sort_values # you code here"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "**Entraîner LassoCV avec random_state = 17 pour choisir la meilleure valeur de $\\alpha$ dans une validation croisée sur 5-fold.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "1261f3d8b86bf6b32a47f4fbd6421a224a32fb25"
   },
   "outputs": [],
   "source": [
    "# alphas = np.logspace(-6, 2, 200)\n",
    "# lasso_cv = LassoCV # you code here\n",
    "# lasso_cv.fit # you code here"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "11cfcfa256d3fadcc41c17c4a203980f43270f86"
   },
   "outputs": [],
   "source": [
    "# lasso_cv.alpha_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "**<font>Question 3: </font> Quelle caractéristique est la moins informative pour prévoir la qualité du vin, selon le modèle LASSO ajusté (avec réglages)?**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "e48d180e412893f9b510a39edcf612d13a865dc9"
   },
   "outputs": [],
   "source": [
    "# lasso_cv_coef = pd.DataFrame # you code here\n",
    "# lasso_cv_coef.sort_values # you code here"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "**<font>Question 4: </font> Quelles sont les erreurs quadratiques moyennes des prédictions LASSO ajustées sur les données d'entraînement et de validation?**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "8c1e912d29500bdd01232dffb7b7b12708a61354"
   },
   "outputs": [],
   "source": [
    "# print(\"Mean squared error (train): %.3f\" % # you code here\n",
    "# print(\"Mean squared error (test): %.3f\" % # you code here"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "## Forêt aléatoire"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "**Entraînez une forêt aléatoire avec des paramètres prêts à l'emploi, en définissant uniquement random_state sur 17.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "ef3ab441dd993dbae6326026fa0b685ecb048e43"
   },
   "outputs": [],
   "source": [
    "# forest = RandomForestRegressor # you code here\n",
    "# forest.fit # you code here"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "**<font>Question 5: </font> Quelles sont les erreurs quadratiques moyennes du modèle RF sur le jeu d'entraînement, en validation croisée (cross_val_score with scoring = 'neg_mean_squared_error' et d'autres arguments laissés avec des valeurs par défaut) et sur les données de validation?**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "78cb1562e5250e2c495954ed2f2007db4e9bd4ac"
   },
   "outputs": [],
   "source": [
    "# print(\"Mean squared error (train): %.3f\" % # you code here\n",
    "# print(\"Mean squared error (cv): %.3f\" % # you code here\n",
    "# print(\"Mean squared error (test): %.3f\" % # you code here"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "**Réglez les hyperparamètres `max_features` et` max_depth` avec GridSearchCV et vérifiez à nouveau la moyenne des validations croisées entre MSE et MSE sur le jeu de données de validation.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "b8fcca3ab63a14e9ebe4e05f1b706affee19ec15"
   },
   "outputs": [],
   "source": [
    "# forest_params = {'max_depth': list(range(10, 25)),\n",
    "#                  'min_samples_leaf': list(range(1, 8)),\n",
    "#                  'max_features': list(range(6,12))}\n",
    "\n",
    "# locally_best_forest = GridSearchCV # you code here\n",
    "# locally_best_forest.fit # you code here"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "daa31046bca781b63e8b08d941d270ed39cca694"
   },
   "outputs": [],
   "source": [
    "# locally_best_forest.best_params_, locally_best_forest.best_score_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "**<font>Question 6: </font> Quelles sont les erreurs quadratiques moyennes du modèle RF ajusté en validation croisée (cross_val_score with scoring = 'neg_mean_squared_error' et autres arguments laissés avec des valeurs par défaut) et sur les données de validation?**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "8b1c78727baa4caa5e5de4fc99289f9c38a78eca"
   },
   "outputs": [],
   "source": [
    "# print(\"Mean squared error (cv): %.3f\" % # you code here\n",
    "# print(\"Mean squared error (test): %.3f\" % # you code here"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "**Montrer l’importance des caractéristiques de RF. Encore une fois, il est préférable de l'afficher comme un DataFrame.** <br>\n",
    "**<font>Question 7: </font> Quelle est la caractéristique la plus importante selon le modèle Random Forest?**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "_uuid": "c5fc1d874ba41c152e0c1dd11eba469320a91613"
   },
   "outputs": [],
   "source": [
    "# rf_importance = pd.DataFrame # you code here\n",
    "# rf_importance.sort_values # you code here"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "fr"
   },
   "source": [
    "**Tirer des conclusions sur la performance des 3 modèles explorés dans cette misson de prédiction particulière.**"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "hide_input": false,
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.4"
  },
  "name": "lesson8_part1_kmeans.ipynb",
  "nbTranslate": {
   "displayLangs": [
    "*"
   ],
   "hotkey": "alt-t",
   "langInMainMenu": true,
   "sourceLang": "en",
   "targetLang": "fr",
   "useGoogleTranslate": true
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": false,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
